// root.db程序配置库结构
package rootdb

import (
	"sync"
	"time"

	"gitee.com/xiaoyutab/xgotool/xgodb"
	"gorm.io/gorm"
)

// 程序配置项
type Config struct {
	RootPath string     // root路径
	DB       *gorm.DB   // 数据库连接
	sync     sync.Mutex // 内部锁
	cache    map[int64][]string
}

var _default Config = Config{
	cache: map[int64][]string{},
}

// 配置项注入
func Regedit(c *Config) {
	if c == nil {
		return
	}
	if c.RootPath != "" {
		_default.RootPath = c.RootPath
	}
}

// 用户设备表
type Dervice struct {
	Id        int64        `gorm:"column:id;primary_key" json:"id,string" form:"id"`          // ID，unix-纳秒时间戳 time.Now().UnixNano()
	Name      string       `gorm:"cilumn:name" json:"name" form:"name"`                       // 设备名称
	Desc      string       `gorm:"cilumn:desc" json:"desc" form:"desc"`                       // 设备备注
	Ip        string       `gorm:"cilumn:ip" json:"ip" form:"ip"`                             // 设备IP，人工备注的IP地址，非真实IP
	Goos      string       `gorm:"cilumn:goos" json:"goos" form:"goos"`                       // 设备类型 runtime.GOOS
	Names     string       `gorm:"cilumn:names" json:"names" form:"names"`                    // 存在的日志文件名，多个使用,拼接
	NamesList []string     `gorm:"-" json:"names_list" form:"names_list"`                     // 设备中存在的日志文件列表
	InLine    int64        `gorm:"column:in_line" json:"in_line" form:"in_line"`              // 是否在线【通过grpc进行在线维持和数据交互】
	LastHart  int64        `gorm:"column:last_hart" json:"last_hart,string" form:"last_hart"` // 上次心跳时间[unix时间戳，秒级]
	Macs      []DerviceMac `gorm:"-" json:"macs" form:"macs"`                                 // 设备网卡地址
}

func (Dervice) TableName() string {
	return "dervice"
}

// 用户设备网卡表，用于关联设备信息
type DerviceMac struct {
	Id      int64  `gorm:"column:id;primary_key" json:"id,string" form:"id"` // ID，unix-纳秒时间戳 time.Now().UnixNano()
	Did     int64  `gorm:"column:did" json:"did,string" form:"did"`          // 设备ID
	MacName string `gorm:"cilumn:mac_name" json:"mac_name" form:"mac_name"`  // 网卡名称【如果需要记录APP/H5端日志，此处可以使用其他名称，如：Android ID、IMEI、UUID等】
	MacAddr string `gorm:"cilumn:mac_addr" json:"mac_addr" form:"mac_addr"`  // 网卡地址
}

func (DerviceMac) TableName() string {
	return "dervice_mac"
}

// 文件存储表，存储日志文件名
type File struct {
	Id               int64     `gorm:"column:id;primary_key" json:"id,string" form:"id"`                              // ID，unix-纳秒时间戳 time.Now().UnixNano()
	Name             string    `gorm:"cilumn:name" json:"name" form:"name"`                                           // 文件名称
	FileSize         int64     `gorm:"cilumn:file_size" json:"file_size" form:"file_size"`                            // 文件大小，单位：B
	MinId            int64     `gorm:"column:min_id" json:"min_id,string" form:"min_id"`                              // 该文件记录的日志最小ID【因ID记录值为纳秒时间戳，所以可以作为开始/结束时间来进行检索】
	MaxId            int64     `gorm:"column:max_id" json:"max_id,string" form:"max_id"`                              // 该文件记录的日志最大ID【因ID记录值为纳秒时间戳，所以可以作为开始/结束时间来进行检索】
	DerviceIds       []Dervice `gorm:"-" json:"dervice_ids" form:"dervice_ids"`                                       // 存在于哪些设备中
	Path             string    `gorm:"cilumn:path" json:"path" form:"path"`                                           // 文件位置
	IsDelete         int64     `gorm:"column:is_deleted" json:"is_deleted" form:"is_deleted"`                         // 是否已删除 0-未删除 1-源文件已删除 2-压缩文件已删除
	Path7z           string    `gorm:"path_7z" json:"path_7z" from:"path_7z"`                                         // 压缩后的压缩包路径
	BackupMail       int64     `gorm:"column:backup_mail" json:"backup_mail" form:"backup_mail"`                      // 备份到邮箱？（作为附件发送到指定邮箱）
	BackupTencentOss int64     `gorm:"column:backup_tencent_oss" json:"backup_tencent_oss" form:"backup_tencent_oss"` // 备份到腾讯云OSS
	BackupAliOss     int64     `gorm:"column:backup_ali_oss" json:"backup_ali_oss" form:"backup_ali_oss"`             // 备份到阿里云OSS
	BackupHuaweiOss  int64     `gorm:"column:backup_huawei_oss" json:"backup_huawei_oss" form:"backup_huawei_oss"`    // 备份到华为云OSS
}

func (File) TableName() string {
	return "file"
}

// 获取最新的文件名/存储路径
//
//	ext	文件后缀（需传入.）
//
//	返回值描述：
//	0	文件名
//	1	文件路径
func getNewName(ext string) (string, string) {
	// 创建新的文件，并写入到配置项中
	path := xgodb.GetString("RUN_FILE_PATH")
	if len(path) == 0 {
		return "", ""
	}
	if path[len(path)-1:] != "/" {
		path += "/"
	}
	name := xgodb.GetString("RUN_FILE_NAME") + time.Now().Format("20060102150405")
	// 追加文件名
	path += name + ext
	return name, path
}
